/*
Array.prototype.map()  是 JavaScript 数组原型对象上的内置方法，可以用于在数组中的每个元素上执行给定的函数，并返回函数执行结果组成的新数组，而不改变原始数组
其中， callback  是要在每个数组元素上执行的函数，可以接受三个参数：当前元素、当前元素的索引、原始数组本身
他和forEach的区别:
map()  和  forEach()  是 JavaScript 数组原型对象上的两个内置方法，它们都可以用于处理数组中的每个元素，但是它们之间有一些不同之处:

1. 返回值
map()  方法会返回一个新数组，其中包含对原数组中的每个元素执行回调函数所生成的结果。而  forEach()  方法则不会返回新数组，它仅仅是遍历原数组中的每个元素并执行回调函数。
2. 回调函数的参数
map()  方法的回调函数可以接受三个参数：当前元素、当前元素的索引和原始数组本身。而  forEach()  方法的回调函数只能接受两个参数：当前元素和当前元素的索引。
3. 副作用
map()  方法不会修改原始数组中的元素，而是创建一个新数组。因此， map()  方法可以用于处理纯函数，即不改变外部状态并且每次都返回相同的结果。另一方面， forEach()  方法可以改变原始数组中的元素，因此它通常用于处理有副作用的函数（会修改函数外部状态的函数）。
综上所述， map()  和  forEach()  方法的最大区别在于， map()  方法会返回一个新数组，而  forEach()  则没有返回值，仅执行回调函数。同时，由于  map()  不会修改原数组，而  forEach()  可以修改原数组，所以这两种方法适用的场景也有所不同。
 */
Array.prototype.myMap = function (callback) {
    let res = []
    if (typeof callback !== 'function') {
        throw new TypeError(callback + 'is not a function')
    }
    for (let i = 0; i < this.length; i ++) {
        // res入回调函数执行的结果
        res.push(callback(this[i], i, this))
    }
    // 返回执行结果
    return res
}
const arr = [1, 2, 3]
const res = arr.myMap((ele, index, arr) => {
    return ele * 2
})
console.log(res)
